package com.scienzeinternazionali.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.scienzeinternazionali.application.ConnectionManager;
import com.scienzeinternazionali.dto.Associazione;
import com.scienzeinternazionali.exception.DataAccessException;
import com.scienzeinternazionali.exception.DataSourceException;
import com.scienzeinternazionali.exception.DocenteException;
import com.scienzeinternazionali.util.LogFactory;

public class CoorteDAO {

		
		  private static Logger logger = LogFactory.getLogger(LogFactory.SCIENZEINTERNAZIONALI);

		  private Statement st = null;
		  private ResultSet rs = null;
		  private Connection conn = null;
		  private PreparedStatement pstm = null;
/* da trasformare in inserisciAssociazione
		  public void inserisciPost(Post post)throws DataAccessException, PostException{
			  logger.debug("inserisciPost IN");
			  String insert;
			  try {
				    conn = ConnectionManager.getConnection();
				    insert = "INSERT into post (data_inserimento,data_ultima_modifica,titolo,post,id_user, stato, link, top) values (CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,?,?,?,?,?,?)";
					logger.debug("insert :" + insert);
					pstm = conn.prepareStatement(insert);
					pstm.setString(1, post.getTitolo());
					pstm.setString(2, post.getPost());
					pstm.setString(3, post.getId_user());
					pstm.setInt(4, post.getStato());
					pstm.setString(5, post.getLink());
					pstm.setInt(6, post.getSticky());
					pstm.executeUpdate();
					pstm.close();
					}catch (SQLException e) {
						e.printStackTrace();
						logger.fatal(e.getMessage());
						throw new PostException("errore durante inserimento del post");
					} catch (Exception e) {
						e.printStackTrace();
						logger.fatal(e.getMessage());
						throw new DataAccessException("errore generale durante inserimento del post");
					} finally {
						ConnectionManager.closeAll(rs, pstm, conn);
						logger.debug("inserisciPost OUT");
					}
		  }
*/
		  /* da aggiornare successivamente in aggiornaAssociazione
		  public void aggiornaPost(Post post)throws DataAccessException, PostException{
			  logger.debug("aggiornaPost IN");
			  String update;
			  try {
				conn = ConnectionManager.getConnection();
				update = "UPDATE post set data_ultima_modifica = CURRENT_TIMESTAMP, titolo = ?,post = ?,id_user = ?, stato = ?, link = ?, top=? where id_post = ?";
				System.out.println(update);
				System.out.println("aggiornaPost post.getId_user() "+post.getId_user());
				System.out.println("aggiornaPost post.getStato()"+post.getStato());
				System.out.println("aggiornaPost post.getId_post()"+post.getId_post());
				System.out.println("aggiornaPost post.getLink()"+post.getLink());
			    logger.debug("update :" + update);
			    pstm = conn.prepareStatement(update);
			    pstm.setString(1, post.getTitolo());
			    pstm.setString(2, post.getPost());
			    pstm.setString(3, post.getId_user());
			    pstm.setInt(4, post.getStato());
			    pstm.setString(5, post.getLink());
			    pstm.setInt(6, post.getSticky());
			    pstm.setInt(7, post.getId_post());
			    pstm.executeUpdate();
			    pstm.close();	
			}catch (SQLException e) {
				e.printStackTrace();
				logger.fatal(e.getMessage());
				throw new PostException("errore durante l'aggiornameno del post");
			} catch (Exception e) {
				e.printStackTrace();
				logger.fatal(e.getMessage());
				throw new DataAccessException("errore generale durante l'aggiornamento del post");
			} finally {
				ConnectionManager.closeAll(rs, pstm, conn);
				logger.debug("aggiornaPost OUT");
			}
		  }
*/
		 
 


			public List<Associazione> getCoorte() throws DataAccessException,DocenteException{
				logger.debug("getCoorte IN");
				List<Associazione> coorte = new ArrayList<Associazione>();
				try {
			        String sql= "select id_associazione, r.anno, cardinale,d.id_docente, d.nome, d.cognome,i.id_insegnamento, i.desc_insegnamento, pianodistudi from docenti d, insegnamenti i, r_docenti_insegnamenti r where d.id_docente=r.id_docente and i.id_insegnamento=r.id_insegnamento";
			        logger.debug(sql);
			        conn = ConnectionManager.getConnection();
			        st = conn.createStatement();
			        rs = st.executeQuery(sql);
			        while (rs.next()) {
			        	Associazione associazione = new Associazione();
			        	associazione.setAnno(rs.getInt(2));
			        	associazione.setCardinale(rs.getInt(3));
			        	associazione.setIdDocente(rs.getInt(4));
			        	associazione.setNomeDocente(rs.getString(5));
			        	associazione.setCognomeDocente(rs.getString(6));
			        	associazione.setIdInsegnamento(rs.getInt(7));
			        	associazione.setDescInsegnamento(rs.getString(8));
			        	associazione.setPianoDiStudi(rs.getString(9));
			        	coorte.add(associazione);
				    }
				}catch (DataSourceException e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DataAccessException(e.getMessage());
				} catch (SQLException e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DocenteException("errore generale durante il caricamento della coorte");
				} catch (Exception e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DataAccessException("errore generale durante l'accesso al DB");
				} finally {
					ConnectionManager.closeAll(rs, pstm, conn);
					logger.debug("getCoorte OUT");
				}
				return coorte;
			}
			
	}
